// 定义返回类型：成功时返回 [data, null]，失败时返回 [undefined, error]
type ToResult<T> = [T, null] | [undefined, any]

/**
 * 将 Promise 转换为 [data, error] 格式，便于错误处理
 * @param promise 要转换的 Promise
 * @param errorExt 可选的错误扩展信息
 * @returns Promise<[data, error]> 成功时 [data, null]，失败时 [undefined, error]
 *
 * @example
 * ```typescript
 * // 使用示例
 * const [data, error] = await to(api.getUser(123))
 * if (error) {
 *   console.error('获取用户失败:', error)
 *   return
 * }
 * // 这里 data 有正确的类型，TypeScript 会推断为 User 类型
 * console.log(data.name) // ✅ 类型安全
 * ```
 */
function to<T>(promise: Promise<T>, errorExt?: anyObj): Promise<ToResult<T>> {
  return promise
    .then((data: T): [T, null] => [data, null])
    .catch((err): [undefined, any] => {
      if (errorExt) {
        const parsedError = Object.assign({}, err, errorExt)
        return [undefined, parsedError]
      }
      return [undefined, err]
    })
}

export default to
